#######################################################
#               Makefile Grupo Klow                   #
#######################################################

# CONFIGURACION
################

# Nombre de los ejecutables.
target_compresorArbol = ppmc-t 
target_compresorHash = ppmc-h
target_arbol = Arbol
target_hash = Hash
target_logger = logger

# CONFIGURACION "AVANZADA"
###########################

# Opciones para el compilador C/C++ en modo ansi.
CXXFLAGS = -Wall -ansi -pedantic-errors

# Para valgrind o debug
CXXFLAGS += -ggdb -DDEBUG -fno-inline

CXXFLAGS += $(CFLAGS)

# Opciones del enlazador.
LDFLAGS = -lm

# enlasador
enlazador = $(CXX)

# para no ver las invocaciones
NoverInvocacion = si
occ := $(CC)
ocxx := $(CXX)
orm := $(RM)
old := $(LD)
ifdef NoverInvocacion 
CC =  @echo "  CC  $@"; $(occ)
CXX = @echo "  CXX/CC $@"; $(ocxx)
RM =  @echo "  CLEAN"; $(orm)
LD =  @echo "  LD  $@"; $(old)
endif
# Tomo todos los archivos para el controlador de nodos
fuentescontrolador ?= $(wildcard ControladorIDsLibres/src/*.c)

# Tomo todos los archivos para el arbol
fuentesArbol ?= $(wildcard ArbolB/src/*.cpp)
fuentesTpArbol ?= $(wildcard TP1-ArbolB/src/*.cpp)

# Tomo todos los archivos para el hash
fuentesHash ?= $(wildcard HashExtensible/src/*.c)
fuentesTpHash ?= $(wildcard TP1-Hash/src/*.c)

# Tomo todos los archivos para el logger
fuentesLogger ?= $(wildcard Logger/src/*.c)
fuentesTpLogger ?= $(wildcard TP1-Logger/src/*.c)

# Tomo todos los archivos para el PPMC
fuentesPPMC ?= $(wildcard Compresor/src/*.cpp)
fuentesManejador ?= $(wildcard Compresor/src/Manejadores/*.cpp)
fuentesBuffers ?= $(wildcard Compresor/src/Buffers/*.cpp)

# Tomo todos los archivos para el PPMC-Arbol
fuentesTp_PPMC_arbol ?= $(wildcard PPMC-Arbol/src/*.cpp)

# Tomo todos los archivos para el PPMC-Hash
fuentesTp_PPMC_hash ?= $(wildcard PPMC-Hash/src/*.cpp)


# REGLAS
#########


.PHONY: all clean

all: $(target_compresorHash) $(target_compresorArbol) $(target_arbol) $(target_hash) $(target_logger) 


# Genero todos los .o para el PPMC-Hash
o_files_ppmc_hash  = $(patsubst %.cpp,%.o,$(fuentesTp_PPMC_hash))
o_files_ppmc_hash += $(patsubst %.cpp,%.o,$(fuentesPPMC))
o_files_ppmc_hash += $(patsubst %.cpp,%.o,$(fuentesManejador))
o_files_ppmc_hash += $(patsubst %.cpp,%.o,$(fuentesBuffers))
o_files_ppmc_hash += $(patsubst %.c,%.o,$(fuentesHash))
o_files_ppmc_hash += $(patsubst %.cpp,%.o,$(fuentesArbol))
o_files_ppmc_hash += $(patsubst %.c,%.o,$(fuentescontrolador))
o_files_ppmc_hash += $(patsubst %.c,%.o,$(fuentesLogger))

# Genero todos los .o para el PPMC-Arbol
o_files_ppmc_arbol = $(patsubst %.cpp,%.o,$(fuentesTp_PPMC_arbol))
o_files_ppmc_arbol+= $(patsubst %.cpp,%.o,$(fuentesPPMC))
o_files_ppmc_arbol+= $(patsubst %.cpp,%.o,$(fuentesManejador))
o_files_ppmc_arbol+= $(patsubst %.cpp,%.o,$(fuentesBuffers))
o_files_ppmc_arbol+= $(patsubst %.cpp,%.o,$(fuentesArbol))
o_files_ppmc_arbol+= $(patsubst %.c,%.o,$(fuentesHash))
o_files_ppmc_arbol+= $(patsubst %.c,%.o,$(fuentescontrolador))
o_files_ppmc_arbol+= $(patsubst %.c,%.o,$(fuentesLogger))

# Genero todos los .o para el arbol
o_files_arbol  = $(patsubst %.cpp,%.o,$(fuentesArbol))
o_files_arbol += $(patsubst %.c,%.o,$(fuentescontrolador))
o_files_arbol += $(patsubst %.cpp,%.o,$(fuentesTpArbol))

# Genero todos los .o para el hash
o_files_hash  = $(patsubst %.c,%.o,$(fuentesTpHash))
o_files_hash += $(patsubst %.c,%.o,$(fuentesHash))
o_files_hash += $(patsubst %.c,%.o,$(fuentescontrolador))

# Genero todos los .o para el logger
o_files_logger  = $(patsubst %.c,%.o,$(fuentesTpLogger))
o_files_logger += $(patsubst %.c,%.o,$(fuentesLogger))

# Genero el ejecutable del PPMC_hash
$(target_compresorHash): $(o_files_ppmc_hash)
	@if [ -z "$(o_files_ppmc_hash)" ]; \
	then \
		echo "No hay archivos de entrada, recuerde que la extensión debe ser '.$(extension)'."; \
		false; \
	fi >&2
	$(enlazador) $(LDFLAGS) $(o_files_ppmc_hash) $(LOADLIBES) $(LDLIBS) -o $(target_compresorHash)

# Genero el ejecutable del PPMC arbol
$(target_compresorArbol): $(o_files_ppmc_arbol)
	@if [ -z "$(o_files_ppmc_arbol)" ]; \
	then \
		echo "No hay archivos de entrada, recuerde que la extensión debe ser '.$(extension)'."; \
		false; \
	fi >&2
	$(enlazador) $(LDFLAGS) $(o_files_ppmc_arbol) $(LOADLIBES) $(LDLIBS) -o $(target_compresorArbol)

# Genero el ejecutable del arbol
$(target_arbol): $(o_files_arbol)
	@if [ -z "$(o_files_arbol)" ]; \
	then \
		echo "No hay archivos de entrada, recuerde que la extensión debe ser '.$(extension)'."; \
		false; \
	fi >&2
	$(enlazador) $(LDFLAGS) $(o_files_arbol) $(LOADLIBES) $(LDLIBS) -o $(target_arbol)

# Genero el ejecutable del hash
$(target_hash): $(o_files_hash)
	@if [ -z "$(o_files_hash)" ]; \
	then \
		echo "No hay archivos de entrada, recuerde que la extensión debe ser '.$(extension)'."; \
		false; \
	fi >&2
	$(enlazador) $(LDFLAGS) $(o_files_hash) $(LOADLIBES) $(LDLIBS) -o $(target_hash)

# Genero el ejecutable del logger
$(target_logger): $(o_files_logger)
	@if [ -z "$(o_files_logger)" ]; \
	then \
		echo "No hay archivos de entrada, recuerde que la extensión debe ser '.$(extension)'."; \
		false; \
	fi >&2
	$(enlazador) $(LDFLAGS)  $(o_files_logger) $(LOADLIBES) $(LDLIBS) -o $(target_logger)


clean:
	@$(RM) -fv *.o $(target_compresorHash) $(target_compresorArbol) $(target_arbol) $(target_hash) $(target_logger)  


